#  函数：将一段代码定义到函数中，可以多次执行函数，减少重复代码

# def ： 定义函数的关键字
# square: 函数名，用于函数的调用, 函数命名和变量命名规则一致
# x 函数的参数
#  s = x ** 2 : 函数的主体
# return s: 函数的返回值
def square(x):
    s = x ** 2
    return s


# 调用函数
i = square(100)
print(i)

# 函数可以多次使用
j = square(200)
print(j)


#  encoding="UTF-8": 参数的默认值，如果不传这个参数会使用默认值，如果传了，会输用传入的值

# 函数的应用
# 定义一个用于读取文件的函数，可以减少每一次读取文件的代码里
def read_file(path, encoding="UTF-8"):
    with open(path, mode="r", encoding=encoding) as f:
        # 去掉后面的换行符并返回
        return [line.rstrip() for line in f.readlines()]


words = read_file("../../data/words.txt")
print(words)

students = read_file("../../data/students.txt")
print(students)


# 可变参数
# i是一个元组
def add(*i, default):
    sum = 0

    # 循环计算元组的和
    for j in i:
        sum = sum + j

    return sum + default


# 如果一个参数在可变参数的后面还有其他参数，其他参数需要通过参数名传参
print(add(100, 200, 10, 20, default=100))
print(add(100, 20, default=100))

print(1)
print(1, 2)
print(1, 2, 3)

# lambda表达式（匿名函数），用于简化函数的定义
# lambda 的函数主体就是返回值
play = lambda x, y: x ** y

i = play(10, 2)
print(i)

# lambda主要用于面向函数编程
# 1、以函数作为参数
# 2、以函数作为返回值
